#pragma once
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <cstdlib>
#include <signal.h>
#include <fcntl.h>
#include <string>
#include "Log.hpp"
#include "comm.hpp"

using namespace LogModule;
const std::string dev = "/dev/null";
// 将服务守护进程化
void Daemon(int nochdir, int noclose)
{
    // 忽略IO, 子进程退出等相关的信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    // 父进程结束
    if(fork() > 0) exit(0);
    
    // 子进程
    setsid(); // 成为一个独立的会话

    if(nochdir == 0) chdir("/");

    // 不需要从键盘输入, 不需要向显示器打印
    // 方法1: 关闭0,1,2(不推荐)
    // 方法2: 打开/dev/null, 进行重定向
    if(noclose == 0)
    {
        int fd = ::open(dev.c_str(), O_RDWR);
        if(fd < 0)
        {
            LOG(LogLevel::FATAL) << "open dev error";
            exit(OPEN_ERR);
        }
        else
        {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    }
    
}